<?php
$path_root_apimailMktLocawebClass = dirname(__FILE__);
$DS = DIRECTORY_SEPARATOR;
$path_root_apimailMktLocawebClass = "{$path_root_apimailMktLocawebClass}{$DS}..{$DS}..{$DS}";
require_once "{$path_root_apimailMktLocawebClass}adm{$DS}class{$DS}default.class.php";
class apiEmailMktLocaweb extends defaultClass{
	protected $dbConn;
	protected $DOMINIO;
	protected $ID_CONTA;
	protected $TOKEN;
	public function __construct() {
		$this->dbConn = new DataBaseClass();
		$this->getCredenciais();
	}
	public function getCredenciais(){
		$sql = array();
		$sql[] = "
		SELECT	api_mkt_locaweb_dominio
				,api_mkt_locaweb_id_conta
				,api_mkt_locaweb_token
			FROM		tb_configuracao
			WHERE	1 = 1
			AND		configuracao_id = '1'
		";
		$result = $this->dbConn->db_query(implode("\n", $sql));
		$rs = array();
		if ($result['success']) {
			if ($result['total'] > 0) {
				$rs = $this->dbConn->db_fetch_assoc($result['result']);
				$this->DOMINIO = $rs['api_mkt_locaweb_dominio'];
				$this->ID_CONTA = $rs['api_mkt_locaweb_id_conta'];
				$this->TOKEN = $rs['api_mkt_locaweb_token'];
			}
		}

	}

	public function dispatchRequest($method, $url, $data = null){
		$url = $this->DOMINIO . $url;
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Auth-Token: {$this->TOKEN}","Content-Type: application/json"));
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

		if(!is_null($data)):
			curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
		endif;

		$resp = curl_exec($ch);
		return $resp;
	}

	public function post($url, $data){
		$data = json_encode($data);
		return $this->dispatchRequest('POST', $url, $data);
	}

	public function get($url, $params = null){
		$url = $url . ($params ? '?'.http_build_query($params, null, '&') : '');
		return $this->dispatchRequest('GET', $url);
	}

	public function put($url, $data){
		$data = json_encode($data);
		return $this->dispatchRequest('PUT', $url, $data);
	}

	public function delete($url, $data){
		$data = json_encode($data);
		return $this->dispatchRequest('DELETE', $url, $data);
	}

	//----- Metodos Para Campanhas ----------//

	/**
	* Function getCampanhas
	*
	* Listagem das campanhas já cadastradas
	* 
	* @return array
	*/
	public function getCampanhas(){
		$url = "accounts/{$this->ID_CONTA}/campaigns";
		$return = $this->get($url);
		return json_decode($return);
	}

	/**
	* Function getCampanha
	*
	* Detalhes de uma determinada campanha
	*
	* @param string id da campanha
	* @return array dados da campanha (id,created_at,updated_at,name)
	*/
	public function getCampanha($id_campanha){
		$url = "accounts/{$this->ID_CONTA}/campaigns/{$id_campanha}";
		$return = $this->get($url);
		return json_decode($return);
	}


	/**
	* Function createCampanha
	*
	* Cria uma campanha
	*
	* @param array dados da nova campanha (name,description)
	* @return array (id da campnha)
	*/
	public function createCampanha($campanha){
		$create = array(
			'campaign'=>$campanha
		);
		$url = "accounts/{$this->ID_CONTA}/campaigns";
		$return = $this->post($url,$create);
		return json_decode($return);
	}


	/**
	* Function editCampanha
	*
	* Atualiza determinada campanha.
	*
	*	@param string id da campanha
	* @param array dados novos da campanha (name,description)
	* @return array (id da campnha)
	*/
	public function editCampanha($id_campanha,$campanha){
		$create = array(
			'campaign'=>$campanha
		);
		$url = "accounts/{$this->ID_CONTA}/campaigns/{$id_campanha}";
		$return = $this->put($url,$create);
		return json_decode($return);
	}


	/**
	* Function deleteCampanha
	*
	* Remove determinada campanha
	*
	*	@param string id da campanha
	* @return string ""
	*/
	public function deleteCampanha($id_campanha,$campanha){
		$create = array(
			'campaign'=>$campanha
		);
		$url = "accounts/{$this->ID_CONTA}/campaigns/{$id_campanha}";
		$return = $this->delete($url,$create);
		return json_decode($return);
	}

	//----- Metodos Para Contatos ----------//

	/**
	* Function getContatos
	*
	* Listagem dos Contatos já cadastradas,
	* 
	* @param string pagina
	* @return array
	*/
	public function getContatos($pagina=1){
		$url = "accounts/{$this->ID_CONTA}/contacts?page={$pagina}";
		$return = $this->get($url);
		return json_decode($return);
	}

	/**
	* Function getContato
	*
	* Detalhes de um determinado Contato
	*
	* @param string id da Contato
	* @return array dados da Contato (id,created_at,updated_at,name)
	*/
	public function getContato($id_Contato){
		$url = "accounts/{$this->ID_CONTA}/contacts/{$id_Contato}";
		$return = $this->get($url);
		return json_decode($return);
	}


	/**
	* Function createContato
	*
	* Cria uma Contato
	*
	* @param array dados do novo Contato (email,list_ids,custom_fields[nome],custom_fields[cidade],custom_fields[data_de_nascimento])
	* @return string (id da contato)
	*/
	public function createContato($Contato){
		$create = array(
			'contact'=>$Contato
		);
		$url = "accounts/{$this->ID_CONTA}/contacts";
		$return = $this->post($url,$create);
		return json_decode($return);
	}


	/**
	* Function editContato
	*
	* Atualiza determinado Contato.
	*
	* @param string id da Contato
	* @param array dados novos da Contato (list_tokens,custom_fields[nome],custom_fields[cidade],custom_fields[data_de_nascimento])
	* @return ""
	*/
	public function editContato($id_Contato,$Contato){
		$create = array(
			'contact'=>$Contato
		);
		$url = "accounts/{$this->ID_CONTA}/contacts/{$id_Contato}";
		$return = $this->put($url,$create);
		return json_decode($return);
	}


	/**
	* Function deleteContato
	*
	* Remove determinad0 Contato
	*
	* @param string id da Contato
	* @return string ""
	*/
	public function deleteContato($id_Contato){
		$url = "accounts/{$this->ID_CONTA}/contacts/{$id_Contato}";
		$return = $this->delete($url,$create);
		return json_decode($return);
	}


	//----- Metodos Para Listas ----------//

	/**
	* Function getListas
	*
	* Listagem das Listas já cadastradas
	* 
	* @return array
	*/
	public function getListas(){
		$url = "accounts/{$this->ID_CONTA}/lists";
		$return = $this->get($url);
		return json_decode($return);
	}

	/**
	* Function getLista
	*
	* Detalhes de uma determinada Lista
	*
	* @param string id da Lista
	* @return array dados da Lista (id,created_at,updated_at,name)
	*/
	public function getLista($id_Lista){
		$url = "accounts/{$this->ID_CONTA}/lists/{$id_Lista}";
		$return = $this->get($url);
		return json_decode($return);
	}


	/**
	* Function createLista
	*
	* Cria uma Lista
	*
	* @param array dados da nova Lista (name,description)
	* @return array (id da lista)
	*/
	public function createLista($Lista){
		$create = array(
			'list'=>$Lista
		);
		$url = "accounts/{$this->ID_CONTA}/lists";
		$return = $this->post($url,$create);
		return json_decode($return);
	}


	/**
	* Function editLista
	*
	* Atualiza determinada Lista.
	*
	* @param string id da Lista
	* @param array dados novos da Lista (name,description)
	* @return array (id da lista)
	*/
	public function editLista($id_Lista,$Lista){
		$create = array(
			'list'=>$Lista
		);
		$url = "accounts/{$this->ID_CONTA}/lists/{$id_Lista}";
		$return = $this->put($url,$create);
		return json_decode($return);
	}


	/**
	* Function deleteLista
	*
	* Remove determinada Lista
	*
	* @param string id da Lista
	* @return string ""
	*/
	public function deleteLista($id_Lista,$Lista){
		$create = array(
			'list'=>$Lista
		);
		$url = "accounts/{$this->ID_CONTA}/lists/{$id_Lista}";
		$return = $this->delete($url,$create);
		return json_decode($return);
	}

	/**
	* Function adicionarContatosLista
	*
	* Adiciona contatos na lista
	*
	* @param string id da lista
	* @param array contatos da lista (email,custom_fields[nome],custom_fields[cidade],custom_fields[data_de_nascimento])
	* @return array (id da lista)
	*/
	public function adicionarContatosLista($id_Lista, $Contatos){
		$create = array(
			'list'=>array(
				'contacts'=>$Contatos
				,"overwriteattributes" => true
			)
		);
		$url = "accounts/{$this->ID_CONTA}/lists/{$id_Lista}/contacts";
		$return = $this->post($url,$create);
		return json_decode($return);
	}


	/**
	* Function removeContatosLista
	*
	* Remove determinada Lista
	*
	* @param string id da Lista
	* @param array emails (email)
	* @return string ""
	*/
	public function removeContatosLista($id_Lista,$emails){
		$create = array(
			'list'=>array(
				'contacts'=>$emails
			)
		);
		$url = "accounts/{$this->ID_CONTA}/lists/{$id_Lista}/remove_contacts";
		$return = $this->delete($url,$create);
		return json_decode($return);
	}
	
	//----- Metodos Para Mensagens ----------//

	/**
	* Function getMensagens
	*
	* Listagem das mensagens já cadastradas
	* 
	* @return array
	*/
	public function getMensagens(){
		$url = "accounts/{$this->ID_CONTA}/messages";
		$return = $this->get($url);
		return json_decode($return);
	}

	/**
	* Function getMensagem
	*
	* Detalhes de uma determinada mensagem
	*
	* @param string id da mensagem
	* @return array dados da mensagem (id,created_at,updated_at,name)
	*/
	public function getMensagem($id_mensagem){
		$url = "accounts/{$this->ID_CONTA}/messages/{$id_mensagem}";
		$return = $this->get($url);
		return json_decode($return);
	}


	/**
	* Function createMensagem
	*
	* Cria uma mensagem
	*
	* @param array dados da nova mensagem ("message": {
			"domain_id": "4fe4dc122c1e5806df000010",
			"html_body": "
				Conteúdo da mensagem em HTML
			",
			"text_body": "Conteúdo TEXTO",
			"list_ids": ["4fa136a52c1e581220000005"],
			"name": "Mensagem 1",
			"sender_name": "Nome do destinatário",
			"sender": "remetente@locaweb.com.br",
			"subject": "Assunto Mensagem 1",
			"scheduled_to": "2012/01/01 00:00:00"
		})
	* @return array (id da mensagem)
	*/
	public function createMensagem($mensagem){
		$create = array(
			'message'=>$mensagem
		);
		$url = "accounts/{$this->ID_CONTA}/messages";
		$return = $this->post($url,$create);
		return json_decode($return);
	}


	/**
	* Function editMensagem
	*
	* Atualiza determinada mensagem.
	*
	* @param string id da mensagem
	* @param array dados novos da mensagem ( {
			"message": {
			"domain_id": "4f3d238d4cfc371414000002",
			"html_body": "
		Conteúdo da mensagem em HTML
		",
			"text_body": "Conteúdo TEXTO Alterado",
			  "list_ids": ["4fe368c32c1e5806df000003"],
			"name": "Mensagem 1 Alterada",
			"sender_name": "Nome do destinatário Alterado",
			"sender": "remetente@locaweb.com.br",
			"subject": "Assunto Mensagem 1 Alterada"
			}
		  })
	* @return array (id da mensagem)
	*/
	public function editMensagem($id_mensagem,$mensagem){
		$create = array(
			'message'=>$mensagem
		);
		$url = "accounts/{$this->ID_CONTA}/messages/{$id_mensagem}";
		$return = $this->put($url,$create);
		return json_decode($return);
	}


	/**
	* Function deleteMensagem
	*
	* Remove determinada mensagem
	*
	*	@param string id da mensagem
	* @return string ""
	*/
	public function deleteMensagem($id_mensagem,$mensagem){
		$url = "accounts/{$this->ID_CONTA}/messages/{$id_mensagem}";
		$return = $this->delete($url);
		return json_decode($return);
	}
	
	
	//----- Metodos Para Dominio ----------//

	/**
	* Function getDominios
	*
	* Listagem dos dominios já cadastrados
	* 
	* @return array
	*/
	public function getDominios(){
		$url = "accounts/{$this->ID_CONTA}/domains";
		$return = $this->get($url);
		return json_decode($return);
	}

	/**
	* Function getDominio
	*
	* Detalhes de um determinado domnio
	*
	* @param string id do dominio
	* @return array dados da dominio
	*/
	public function getDominio($id_mensagem){
		$url = "accounts/{$this->ID_CONTA}/domains/{$id_mensagem}";
		$return = $this->get($url);
		return json_decode($return);
	}
}